# 变量存储的并不是值，而是值对应的内存地址
# 可变类型，相同的内存地址，允许值作出修改
# 不可变类型，相同的内存地址，不允许值做出新修改
# 每当可变类型的数据类型被声明的时候，都会重新分配内存地址

# print(id("a"))
# print(id("b"))
# print(id("c"))
#
# p = "a"
#
# print(id(p))

# i = (1,)
# p = (1, )
# print(id(i))
# print(id(p))

# i = []
# p = []
# print(id(i))
# print(id(p))
# i.append(1)
# p.append(2)
#
# print(id(i))
# print(id(p))

# i = [1]  # 100
# p = [1]  # 100
#
# i.append(2)  # [1, 2]
# p.append(3)  # [1, 3]


## 引用
# 变量赋值，永远都是赋值内存地址

# i = []
# p = i
#
# i = []
#
# i.append(0)
#
# print(i)
# print(p)

# lst = []  # 100
#
# dic = {
#     "lst": lst  # 100
# }
#
# lst.append(0)
# print(lst)
# print(dic)
#
# dic['lst'].append(1)
# print(lst)
# print(dic)

"""
可变数据类型：list/dict/set，值改变，内存地址不会改变。总结意思就是，程序允许该内存地址的值发生改变。
不可变数据类型，number/str/tuple/bool
下面我们将通过解析内存地址来说明为什么数据类型分为可变和不可变

我们可以借助 id() 来查看变量的内存地址

首先，我们需要明确以下规则：

变量不存储值，只存储值对应的内存地址
数据一旦被声明，就会确定其内存地址，每个值都会有其对应的内存地址
dict/list/set，这三种数据类型声明时，尽管长得一样，也会重新申请内存地址
"""
